package org.xx.armory.commons;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import static org.xx.armory.commons.Validators.notBlank;
import static org.xx.armory.commons.Validators.notNull;

/**
 * 标记了路径的输入流。
 */
public class PathInputStream
        extends InputStream {
    private final String path;
    private final InputStream baseStream;

    /**
     * 通过路径和内部输入流构造PathInputStream的实例。
     *
     * @param path
     *         路径，自动去掉首尾空格。
     * @param baseStream
     *         内部输入流。
     * @throws IllegalArgumentException
     *         如果参数{@code path}是{@code null}或者只包含空白字符，如果参数{@code baseStream}是{@code null}。
     */
    public PathInputStream(
            String path,
            InputStream baseStream
    ) {
        this.path = notBlank(path, "path").trim();
        notNull(baseStream, "baseStream");
        if (baseStream instanceof BufferedInputStream) {
            this.baseStream = baseStream;
        } else {
            this.baseStream = new BufferedInputStream(baseStream);
        }
    }

    /**
     * 通过文件对象构造PathInputStream的实例。
     *
     * @param file
     *         准备打开并读取的文件对象。
     * @throws IOException
     *         如果打开文件对象时出错。
     */
    public PathInputStream(
            File file
    )
            throws IOException {
        this(file.getPath(), new BufferedInputStream(new FileInputStream(file)));
    }

    /**
     * 获取和输入流关联的路径。
     *
     * @return 输入流关联的路径。
     */
    public final String getPath() {
        return this.path;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int read()
            throws IOException {
        return this.baseStream.read();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void close()
            throws IOException {
        this.baseStream.close();
    }
}
